﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpDevService.h"
#include "IConfigRecord.h"

namespace gcmp
{
    /// \brief  BehaviorConfig配置记录的名称
    struct GCMP_DEV_SERVICE_EXPORT BehaviorConfigRecordNames
    {
        static const wchar_t * ConfigFileVersion;          ///< 配置文件版本号
        static const wchar_t * EnableLog;                  ///< 是否启用日志
        static const wchar_t * EnableDump;                 ///< 是否启用Dump
        static const wchar_t * EnableConsistencyCheck;     ///< 是否启用文件一致性检查
        static const wchar_t * EnableDebugMessage;         ///< 是否启用调试信息
        static const wchar_t * ClientAppName;              ///< 应用名称
        static const wchar_t * OpenViewLimit;              ///< 开启视图最大数目
        static const wchar_t * ProductType;                ///< 产品许可类型
        static const wchar_t * RunAsService;               ///< Gcmp是否配置为服务
    };
    /// \brief  产品许可类型值
    struct GCMP_DEV_SERVICE_EXPORT ProductTypeRecordValues
    {
        static const wchar_t * FamilyEditor;                  ///< 构件编辑器
        static const wchar_t * StructuralDetailing;           ///< 砌体排砖工具
        static const wchar_t * CheckLicense;                  ///< 检测许可证
        static const wchar_t * CheckLicense_WithFullFunciton; ///< 检测许可证
        static const wchar_t * InHourseMode;                  ///< 内部类型
    };

    /// \brief  管理行为配置文件
    class GCMP_DEV_SERVICE_EXPORT IBehaviorConfig
    {
    public:
        /// \brief 设置配置文件路径，并加载配置项。 第一次使用前，用户需指定behavior_config的路径。
        /// \param behaviorConfigPath 配置文件路径。
        /// \return 设置成功则返回true；否则，返回false。
        static bool SetBehaviorConfigPath(const std::wstring& behaviorConfigPath);

        /// \brief 通过配置项名称获取配置项。
        /// \param recordName 配置项名称。
        /// \return 返回配置项，如果不存在，则返回nullptr。
        static const IConfigRecord* GetConfigRecord(const std::wstring& recordName);

        /// \brief 获取配置项的整型值。
        /// \param recordName 配置项名称。
        /// \return 如果存在，则返回其整型值，如果不存在则返回0。
        static int GetConfigRecordValueAsInt(const std::wstring& recordName);

        /// \brief 获取配置项的浮点值。
        /// \param recordName 配置项名称。
        /// \return 如果存在，则返回其浮点值，如果不存在则返回0.0。
        static double GetConfigRecordValueAsDouble(const std::wstring& recordName);

        /// \brief 获取配置项的字符串值。
        /// \param recordName 配置项名称。
        /// \return 如果存在，则返回其字符串值，如果不存在则返回空字符串。
        static std::wstring GetConfigRecordValueAsString(const std::wstring& recordName);

        /// \brief 保存配置文件。
        /// \return 成功则返回true，否则返回false。
        static bool SaveConfigFile();

        /// \brief 是否为合法产品许可。
        /// \param productType 产品许可名称。
        /// \return 是合法的则返回true，否则返回false。
        static bool IsValidProductType(const std::wstring& productType);

        /// \brief 添加一条配置，如果同名配置已存在，则跳过并返回false。
        /// \param opConfigRecord 要添加的配置项。
        /// \return 添加配置成功则返回true，否则返回false。
        static bool AddConfigRecord(OwnerPtr<IConfigRecord> opConfigRecord);

        /// \brief 修改一条配置，不存在则跳过并返回false。
        /// \param opConfigRecord 要更新的配置项
        /// \return 更新成功则返回true，否则返回false。
        static bool UpdateConfigRecord(OwnerPtr<IConfigRecord> opConfigRecord);

        /// \brief 设置配置文件路径
        /// \param configFilePath 新的配置文件路径
        /// \return 旧的配置文件路径
        static std::wstring RedirectConfigFilePath(const std::wstring& configFilePath);
    };
}

